import 'Symbol.dart';
import 'stack.dart';
class StackFrame{
  //存储变量的值
  Map<Symbol, Object?> values={};
  //返回值，当调用函数的时候，返回值放在这里
  Object? retVal;

}
/**
 * 用于封装Return语句的返回结果，并结束后续语句的执行。
 */
class ReturnValue{
  int tag_ReturnValue = 0;
  Object? value;
  ReturnValue(this.value);
  static bool isReturnValue(Object? v){
    return v is ReturnValue;
  }
}


/////////////////////////////////////////////////////////////////////////
// 解释器

/// 遍历AST，执行函数调用。
class Interpreter{

  //调用栈
  Stack<StackFrame> callStack=Stack();

  //当前栈桢
  StackFrame currentFrame= StackFrame();

  void pushFrame(StackFrame frame){
    callStack.push(frame);
  }
  void popFrame(){
    callStack.pop();
  }
  Interpreter(){
      callStack.push(currentFrame);
  }
  //把返回值设置到上一级栈桢中（也就是调用者的栈桢）
  void setReturnValue(Object? retVal){
    var frame = callStack[callStack.size()-2];
    frame.retVal = retVal;
  }
  Object? getVariableValue(VarSymbol sym){
    if(currentFrame.values.containsKey(sym)) {
      return currentFrame.values[sym];
    }
    return null;
  }
  void setVariableValue(VarSymbol sym,Object?  value){
    currentFrame.values[sym] = value;
  }
}